package ru.susu.algebra.partition.polyhedron;

import ru.susu.algebra.partition.polyhedron.checkers.IVertexChecker;
import ru.susu.algebra.partition.polyhedron.checkers.PowVertexChecker;
import ru.susu.algebra.partition.polyhedron.checkers.ProductVertexChecker;
import ru.susu.algebra.partition.polyhedron.checkers.SimplexMethodVertexChecker;
import ru.susu.algebra.partition.polyhedron.checkers.TwoCompositionChecker;
import ru.susu.algebra.partition.polyhedron.providers.AllVertexesProvider;
import ru.susu.algebra.partition.polyhedron.providers.RecursiveVertexesProvider;
import ru.susu.algebra.properties.MapPropertySource;


/**
 * Поиск вершин полиэндра разбиений (вершин многогранника).
 * Оптимизации:
 * 1. Когда мы проверяем конкретное разбиение, то оно может получиться только из тех, у которых
 *    на позициях, где у данного нули записаны также нули.
 *
 * @author akargapolov
 * @since: 22.02.2010
 */
public class PolyhedronVertexFinder
{
	public static void main(String[] args)
	{
		//MapPropertyContainer properties = getSimpleProperties();
		MapPropertySource properties = getRecursiveAndAllCheckersProperties();
		VertexesFinder finder = new VertexesFinder(properties);
		finder.run();
	}


	public static MapPropertySource getSimpleProperties()
	{
		MapPropertySource properties = new MapPropertySource();
		properties.setValue(VertexesFinder.START_NUMBER, 1);
		properties.setValue(VertexesFinder.END_NUMBER, 15);
		properties.setValue(VertexesFinder.CHECKERS_ARRAY,
				new IVertexChecker[]{
				new PowVertexChecker(),
				new ProductVertexChecker(),
				new SimplexMethodVertexChecker()});
		properties.setValue(VertexesFinder.VERTEXES_PROVIDER, new AllVertexesProvider());
		return properties;
	}

	public static MapPropertySource getRecursiveAndAllCheckersProperties()
	{
		MapPropertySource properties = new MapPropertySource();
		properties.setValue(VertexesFinder.START_NUMBER, 1);
		properties.setValue(VertexesFinder.END_NUMBER, 60);
		properties.setValue(VertexesFinder.CHECKERS_ARRAY,
				new IVertexChecker[]{
				new PowVertexChecker(),
				new ProductVertexChecker(),
				new TwoCompositionChecker(),
				new SimplexMethodVertexChecker()
		});
		properties.setValue(VertexesFinder.VERTEXES_PROVIDER, new RecursiveVertexesProvider());
		return properties;
	}

}
